<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>QT 翻译 有关tr的那些事 | Vico的个人博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="目前使用环境QT 5.9.8   +   msvc2013_64 最近做的一个项目需要到支持多国语言，其中跌跌撞撞遇见了不少的坑，有乱码问题导致显示不了字符，还有qt vs tool自带的 lupdate和lrealease用不了。以及在qt语言家中翻译完成之后，界面上却显示不出来的。查了不少资料，总算将这些问题全都解决了。记录这几天的研究成果 注意 看到这先不要着急按照步骤开始进行请对照下面注意">
<meta property="og:type" content="article">
<meta property="og:title" content="QT 翻译 有关tr的那些事">
<meta property="og:url" content="https://vicolj.gitee.io/2021/03/08/QT-%E7%BF%BB%E8%AF%91-%E6%9C%89%E5%85%B3tr%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/index.html">
<meta property="og:site_name" content="Vico的个人博客">
<meta property="og:description" content="目前使用环境QT 5.9.8   +   msvc2013_64 最近做的一个项目需要到支持多国语言，其中跌跌撞撞遇见了不少的坑，有乱码问题导致显示不了字符，还有qt vs tool自带的 lupdate和lrealease用不了。以及在qt语言家中翻译完成之后，界面上却显示不出来的。查了不少资料，总算将这些问题全都解决了。记录这几天的研究成果 注意 看到这先不要着急按照步骤开始进行请对照下面注意">
<meta property="og:locale">
<meta property="article:published_time" content="2021-03-08T13:43:39.000Z">
<meta property="article:modified_time" content="2021-03-09T14:51:52.242Z">
<meta property="article:author" content="Vico">
<meta property="article:tag" content="QT">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/atom.xml" title="Vico的个人博客" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/css/style.css">

  
    
<link rel="stylesheet" href="/fancybox/jquery.fancybox.min.css">

  
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">Vico的个人博客</a>
      </h1>
      
        <h2 id="subtitle-wrap">
          <a href="/" id="subtitle">Vico的个人博客</a>
        </h2>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://vicolj.gitee.io"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-QT-翻译-有关tr的那些事" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/2021/03/08/QT-%E7%BF%BB%E8%AF%91-%E6%9C%89%E5%85%B3tr%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/" class="article-date">
  <time class="dt-published" datetime="2021-03-08T13:43:39.000Z" itemprop="datePublished">2021-03-08</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="p-name article-title" itemprop="headline name">
      QT 翻译 有关tr的那些事
    </h1>
  

      </header>
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <p>目前使用环境QT 5.9.8   +   msvc2013_64</p>
<p>最近做的一个项目需要到支持多国语言，其中跌跌撞撞遇见了不少的坑，有乱码问题导致显示不了字符，还有qt vs tool自带的 lupdate和lrealease用不了。<br>以及在qt语言家中翻译完成之后，界面上却显示不出来的。查了不少资料，总算将这些问题全都解决了。记录这几天的研究成果</p>
<p><strong>注意</strong></p>
<p>看到这先不要着急按照步骤开始进行<br>请对照下面注意事项，防止后面操作遇阻<br>1.windows环境变量是否设置<br>进入快捷方式 win + Q 输入 环境变量 按下回车即可<br>    更改windows环境变量，将qt编译器安装目录添加进去 D:\Qt\Qt5.9.8\5.9.8\msvc2013_64\bin 见最后的图<br>2.xxx.pro中是否有将 所需要翻译的源文件（.cpp）或ui界面添加进去   否则使用lupdate时会很痛苦<br>    将会发现你用tr包裹的字符串一个都没有帮你检索出来。（当然也可以自己更改.ts文件逐句添加）灰常的繁琐</p>
<p>步骤解析：<br>1.在项目中创建一个临时的xxx.pro，并在其中添加 TRANSLATIONS = xxx_en.ts   //一般来说 英语 en 中文 zh<br>2.使用lupdate生成.ts文件<br>    进入QT安装目录 eg：D:\Qt\Qt5.9.8\5.9.8\msvc2013_64\bin  按住 shift + 鼠标右键选择在此处打开powershell窗口<br>        在命令行中输入 ./lupdate.exe 项目路径 + xxx.pro  将会在项目路径下创建一个.ts文件<br>3.打开qt自带的linguist（qt语言家）进行翻译<br>    快捷进入：win + Q 输入 linguist 按下回车即可<br>4.生成.qm文件<br>    点击菜单栏左上角 发布   将会自动在项目路径下创建一个xxx_en.qm文件<br>5.在程序中下载.qm文件<br>在main.cpp中 添加以下代码</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">int main(int argc, char *argv[])</span><br><span class="line">&#123;</span><br><span class="line">    QApplication app(argc, argv);</span><br><span class="line">    QTranlator tranlator</span><br><span class="line">    tranlator.load(&quot;xxx.qm&quot;)；</span><br><span class="line">    app.installTranslator(&amp;tranlator);</span><br><span class="line"></span><br><span class="line">    return app.exec();</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>


<p>问题总结：<br>1.乱码问题：<br>    当我们使用tr()包裹中文时 乱码问题尤为明显<br>    这类问题99%都是编码不对<br>    这里我使用的方法，将源文件转化为utf-8 带签名  在VS中菜单栏左上角 高级保存功能 即可更改当前编码  若在qt语言家中还是发现有乱码存在，可将行尾设置为 windows（CR LF）<br>    乱吗问题完美得到解决<br>2.lupdate中检索不到tr包裹字符问题：<br>    在xxx.pro中添加源代码路径</p>
<p>一些很重要的东西：</p>
<pre><code>qt到底是怎样进行翻译的 （见下图）
</code></pre>
<p>怎样写才算正确的使用tr呢？这里我们一起来探讨一下<br>我们都知道 tr是属于QObject类 所以我们使用 tr 时必须继承QObject类<br>可能有人会说我可以直接使用QObject::tr() 来进行翻译啊<br>这时很有可能导致这样一个现象   你高高心心在qt语言家中翻译完成  然则在界面中显示不出来（此处后面会给出说明以及解决方法）</p>
<p>/<strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><em>/<br>在使用tr()函数时，还有几种字符串变量，需要特别注意：<br>静态变量（编译期间确定字符串，可以是类成员变量，也可以是函数内static变量）<br>全局变量（定义在全局作用域的变量，此时无上下文）<br>const常量（运行期间不能被修改）<br>/</em></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>/</p>
<p>一般的用法：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">其中class Test&#123;</span><br><span class="line">    Q_OBJECT    &#x2F;&#x2F;这宏非常关键  默认是当前类作为上下文</span><br><span class="line">    public:</span><br><span class="line">    Test();</span><br><span class="line">    ~Test();</span><br><span class="line">&#125; </span><br><span class="line">Test::Test&#123;</span><br><span class="line">    QLabel *label &#x3D; new QLabel(this);</span><br><span class="line">    label-&gt;setText(tr(&quot;this a label&quot;));  &#x2F;&#x2F;不建议使用tr()包裹中文 </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>


<p>如果你是属于这一类型，恭喜你，这里按照上述步骤正常执行完全ok</p>
<p>非一般用法： (无上下文  类中没有Q_OBJECT宏)<br>当你要翻译一个结构体中的字符时 刚好这里的结构体在不属于某一个类 这时你可能会使用 QObject::tr() 你将会发现编译器不会报错 以及 qt语言家也能够检索到<br>    但是在界面上就是翻译不出来   这里的核心原因就是缺少的Q_OBJECT宏   解决方法如下</p>
<p>可以使用Qt提供的两个宏 QT_TR_NOOP 和 QT_TRANSLATE_NOOP  前者是用来翻译一个字符串，后者可以翻译多个字符串。</p>
<p>这里我使用的时 宏 QT_TRANSLATE_NOOP(QString &amp;contain,char* translatecontent)有两个参数  第一个参数：规定当前翻译字符所属的上下文  第二个参数：就是需要翻译的文本了  </p>
<p>举例：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">&#x2F;&#x2F;全局中的结构体  </span><br><span class="line">Typdef struct&#123;</span><br><span class="line">    Const char* translation_me;&#x2F;&#x2F;这里需要使用char* 不能使用QString </span><br><span class="line">&#125;MYtranslate；</span><br><span class="line"></span><br><span class="line">static MYtranslate mytranslae[]&#123;</span><br><span class="line"></span><br><span class="line">    &#123;&quot;firstly you must be translation me&quot;&#125;,</span><br><span class="line">    &#123;&quot;then you must be translation me&quot;&#125;,</span><br><span class="line">    &#123;&quot;lastly you must be translation me&quot;&#125;,</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Test::Test()</span><br><span class="line">&#123;</span><br><span class="line">    QLabel firstlabel &#x3D; new QLabel(this);</span><br><span class="line">    firstlabel-&gt;setText(qApp-&gt;translate(&quot;MyContext&quot;,mytranslae[0]));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>


<p>最后：看看大佬们都是怎样做的</p>
<p>QLocale的妙用：<br>    QString locale = QLocale::system().name(); 可以得到当前国家的简写，比如你现在在中国 就是 zh  德国 de</p>
<p>翻译文件的命名如果遵循 Qt 的规范写的话会自动被识别这是哪个语言的翻译文件，<br>比如“app_zh.ts”中的“zh”。 所以高手们用 QTranslator:: load() 函数一般是这样的：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">int main(int argc, char *argv[])</span><br><span class="line">&#123;</span><br><span class="line">    QApplication app(argc, argv);</span><br><span class="line"></span><br><span class="line">    QString locale &#x3D; QLocale::system().name();</span><br><span class="line">    QTranslator translator;</span><br><span class="line">    translator.load(QString(&quot;xxx_&quot;) + locale);</span><br><span class="line">    app.installTranslator(&amp;translator);</span><br><span class="line">    </span><br><span class="line">    return app.exec();</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>


<p>你看，用 QLocale 直接就能获得计算机的区域设置“zh”了。如果这个程序在德语的操作系统环境下就会加载“app_de.qm”文件。</p>
<p>结语<br>    主观记录会偏多，希望大家多多指导！<br>    部分参考文献：<br>    <a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/44536503">https://zhuanlan.zhihu.com/p/44536503</a><br>    <a target="_blank" rel="noopener" href="https://mdzz.ru/2019/05/11/qt-tr/">https://mdzz.ru/2019/05/11/qt-tr/</a></p>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://vicolj.gitee.io/2021/03/08/QT-%E7%BF%BB%E8%AF%91-%E6%9C%89%E5%85%B3tr%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/" data-id="ckm0oahj70000lsd5a27k22iq" data-title="QT 翻译 有关tr的那些事" class="article-share-link">Share</a>
      
      
      
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/QT/" rel="tag">QT</a></li></ul>

    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/2021/03/08/QT%20%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6%E7%B3%BB%E7%BB%9F/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          QT 日志框架系统
        
      </div>
    </a>
  
  
    <a href="/2021/03/08/%E4%BD%BF%E7%94%A8%20QVariant%20%E4%BC%A0%E9%80%92%E6%8C%87%E9%92%88%E7%9A%84%E5%A6%99%E7%94%A8/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">使用 QVariant 传递指针   的妙用</div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/tags/IEC%E8%A7%84%E8%8C%83/" rel="tag">IEC规范</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/QT/" rel="tag">QT</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/tags/IEC%E8%A7%84%E8%8C%83/" style="font-size: 10px;">IEC规范</a> <a href="/tags/QT/" style="font-size: 20px;">QT</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2021/03/">March 2021</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2021/03/29/IEC104%E8%A7%84%E8%8C%83/">IEC104规范</a>
          </li>
        
          <li>
            <a href="/2021/03/13/const%20%E4%B8%8E%20constexpr%20%E7%9A%84%E5%8C%BA%E5%88%AB/">(no title)</a>
          </li>
        
          <li>
            <a href="/2021/03/08/QT%20%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6%E7%B3%BB%E7%BB%9F/">QT 日志框架系统</a>
          </li>
        
          <li>
            <a href="/2021/03/08/QT-%E7%BF%BB%E8%AF%91-%E6%9C%89%E5%85%B3tr%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/">QT 翻译 有关tr的那些事</a>
          </li>
        
          <li>
            <a href="/2021/03/08/%E4%BD%BF%E7%94%A8%20QVariant%20%E4%BC%A0%E9%80%92%E6%8C%87%E9%92%88%E7%9A%84%E5%A6%99%E7%94%A8/">使用 QVariant 传递指针   的妙用</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2021 Vico<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/js/jquery-3.4.1.min.js"></script>



  
<script src="/fancybox/jquery.fancybox.min.js"></script>




<script src="/js/script.js"></script>





  </div>
</body>
</html>